package com.summer.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ConnectDB {

	// 注册驱动，驱动只需要加载一次即可
	// 所以写在静态代码段中（static）
	// 类的静态代码块，随着类的加载，只执行一次。
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 建立链接。需要单独创建一个方法。
	// 通过返回值返回链接对象。
	// 链接每次用完之后就会关闭。
	public static Connection getConnection() {
		try {
			String url = "jdbc:mysql://127.0.0.1:3306/liuwen_db?characterEnconding=UTF-8&serverTimezone=UTC&useSSL=false";
			String user = "root"; // 数据库账户
			String password = "xx710922"; //密码
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 增删改的通用方法
	 * 
	 * @param String sql 要执行的sql
	 * @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数 Object... 可变参数
	 */
	public static boolean executeUpdate(String sql, Object... args) {
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			int i = ps.executeUpdate();
			if (i > 0)
				return true;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(conn, ps, null);
		}
		return false;

	}

	// c查询的通用方法
	public static List<Map<String, Object>> executeQuery(String sql, Object... args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet set = null;

		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			/* 有可能有参数 */
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			/* 执行 */
			set = ps.executeQuery();
			/* 需要将所有数据都存放到 List中 每一行 用一个 map存放 */
			List<Map<String, Object>> list = new ArrayList<>();
			/* 获取本次查询结果集有多少列 */
			int count = set.getMetaData().getColumnCount();

			while (set.next()) {
				Map<String, Object> map = new HashMap<>();// 一行数据 用一个map 接收

				for (int i = 0; i < count; i++) {
					String name = set.getMetaData().getColumnLabel(i + 1);
					map.put(name, set.getObject(name));
				}
				/* 将每行的map存放到 List中 */
				list.add(map);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn, ps, set);
		}
		return null;
	}

	// 关闭的通用方法
	private static void close(Connection conn, PreparedStatement st, ResultSet set) {
		try {
			if (set != null) {
				set.close();
			}
			if (st != null) {
				st.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
